import 'package:dio/dio.dart';

///管理CancelToken
class CancelTokenManage {
  static final Map<String, Set<CancelToken>> _cancelTokenMap = {};

  static createKey(Object key) => identityHashCode(key).toString();

  static getKey(Object key) => key is String ? key : identityHashCode(key).toString();

  //获取
  static Set<CancelToken>? get(Object key) {
    return _cancelTokenMap[getKey(key)];
  }

  //添加
  static void add(Object key, CancelToken cancelToken) {
    _cancelTokenMap[getKey(key)] ??= {};
    _cancelTokenMap[getKey(key)]!.add(cancelToken);
  }

  //移除
  static void remove(Object key) {
    _cancelTokenMap.remove(getKey(key));
  }

  //移除具体某个
  static void removeToken(Object key, CancelToken cancelToken) {
    _cancelTokenMap[getKey(key)]?.remove(cancelToken);
  }

  //取消
  static void cancel(Object key) {
    _cancelTokenMap[getKey(key)]?.forEach((cancelToken) {
      cancelToken.cancel();
    });
    remove(key);
  }

  //取消具体某个
  static void cancelToken(Object key, CancelToken cancelToken) {
    _cancelTokenMap[getKey(key)]?.remove(cancelToken);
    cancelToken.cancel();
  }

  //是否包含
  static bool containsKey(Object key) => _cancelTokenMap.containsKey(getKey(key));

  //取消全部
  static void cancelAll() {
    _cancelTokenMap.forEach((key, cancelTokens) {
      for (var cancelToken in cancelTokens) {
        cancelToken.cancel();
      }
    });
    _cancelTokenMap.clear();
  }

  //添加并且自动创建
  static CancelToken addAndCreate(Object key) {
    var cancelToken = CancelToken();
    add(getKey(key), cancelToken);
    return cancelToken;
  }
}
